package com.EAsystem.interceptor;

import com.EAsystem.entity.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 登录拦截器
 * 只负责检查用户是否已登录，权限控制交给AOP处理
 */
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 在请求处理之前进行调用（Controller方法调用之前）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        String contextPath = request.getContextPath();
        
        // 获取相对路径
        String path = requestURI.substring(contextPath.length());
        
        // 不需要登录验证的路径
        if (isExcludedPath(path)) {
            return true;
        }
        
        // 获取session
        HttpSession session = request.getSession(false);
        if (session == null) {
            redirectToLogin(request, response);
            return false;
        }
        
        // 检查用户是否已登录
        User loggedInUser = (User) session.getAttribute("loggedInUser");
        if (loggedInUser == null) {
            redirectToLogin(request, response);
            return false;
        }
        
        // 刷新session过期时间
        session.setMaxInactiveInterval(30 * 60); // 30分钟
        
        // 登录验证通过，权限检查交给AOP处理
        return true;
    }

    /**
     * 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 可以在这里添加一些通用的模型数据
        if (modelAndView != null) {
            HttpSession session = request.getSession(false);
            if (session != null) {
                User loggedInUser = (User) session.getAttribute("loggedInUser");
                if (loggedInUser != null) {
                    modelAndView.addObject("currentUser", loggedInUser);
                }
            }
        }
    }

    /**
     * 在整个请求结束之后被调用，也就是在DispatcherServlet渲染了对应的视图之后执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 可以进行资源清理工作
        if (ex != null) {
            // 记录异常日志
            System.err.println("请求处理异常: " + ex.getMessage());
        }
    }

    /**
     * 判断是否为不需要登录验证的路径
     */
    private boolean isExcludedPath(String path) {
        // 静态资源路径
        if (path.startsWith("/resources/") || 
            path.startsWith("/css/") || 
            path.startsWith("/js/") || 
            path.startsWith("/images/") ||
            path.startsWith("/fonts/") ||
            path.endsWith(".css") ||
            path.endsWith(".js") ||
            path.endsWith(".png") ||
            path.endsWith(".jpg") ||
            path.endsWith(".jpeg") ||
            path.endsWith(".gif") ||
            path.endsWith(".ico")) {
            return true;
        }
        
        // 登录相关路径
        if (path.equals("/") || 
            path.equals("/user/login") || 
            path.startsWith("/user/login")) {
            return true;
        }
        
        // 其他公开路径（如果有的话）
        if (path.equals("/error") || 
            path.equals("/404") || 
            path.equals("/500")) {
            return true;
        }
        
        return false;
    }

    /**
     * 重定向到登录页面
     */
    private void redirectToLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String contextPath = request.getContextPath();
        
        // 如果是AJAX请求
        if (isAjaxRequest(request)) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write("{\"code\":401,\"message\":\"未登录或登录已过期\",\"redirect\":\"" + contextPath + "/user/login\"}");
        } else {
            // 普通请求重定向到登录页面
            response.sendRedirect(contextPath + "/user/login");
        }
    }

    /**
     * 判断是否为AJAX请求
     */
    private boolean isAjaxRequest(HttpServletRequest request) {
        String requestedWith = request.getHeader("X-Requested-With");
        return "XMLHttpRequest".equals(requestedWith) || 
               request.getHeader("Accept") != null && request.getHeader("Accept").contains("application/json");
    }
} 